<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Chapter 15. 拡張機能</title>
<meta name="generator" content="DocBook XSL Stylesheets V1.75.1">
<link rel="home" href="index.html" title="Smarty マニュアル">
<link rel="up" href="smarty.for.programmers.html" title="Part III. プログラマのための Smarty">
<link rel="prev" href="caching.cacheable.html" title="キャッシュ可能なプラグインの出力の制御">
<link rel="next" href="advanced.features.prefilters.html" title="プリフィルタ">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<div class="navheader">
<table width="100%" summary="Navigation header">
<tr><th colspan="3" align="center">Chapter 15. 拡張機能</th></tr>
<tr>
<td width="20%" align="left">
<a accesskey="p" href="caching.cacheable.html">Prev</a> </td>
<th width="60%" align="center">Part III. プログラマのための Smarty</th>
<td width="20%" align="right"> <a accesskey="n" href="advanced.features.prefilters.html">Next</a>
</td>
</tr>
</table>
<hr>
</div>
<div class="chapter" title="Chapter 15. 拡張機能">
<div class="titlepage"><div><div><h2 class="title">
<a name="advanced.features"></a>Chapter 15. 拡張機能</h2></div></div></div>
<div class="toc">
<p><b>Table of Contents</b></p>
<dl>
<dt><span class="sect1"><a href="advanced.features.html#advanced.features.objects">オブジェクト</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.prefilters.html">プリフィルタ</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.postfilters.html">ポストフィルタ</a></span></dt>
<dt><span class="sect1"><a href="advanced.features.outputfilters.html">アウトプットフィルタ</a></span></dt>
<dt><span class="sect1"><a href="section.template.cache.handler.func.html">キャッシュハンドラ関数</a></span></dt>
<dt><span class="sect1"><a href="template.resources.html">テンプレートリソース</a></span></dt>
<dd><dl>
<dt><span class="sect2"><a href="template.resources.html#templates.from.template.dir">$template_dir からのテンプレート</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#templates.from.any.dir">任意のディレクトリからのテンプレート</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#templates.from.elsewhere">その他のリソース内のテンプレート</a></span></dt>
<dt><span class="sect2"><a href="template.resources.html#default.template.handler.function">デフォルトのテンプレートハンドラ関数</a></span></dt>
</dl></dd>
</dl>
</div>
<div class="sect1" title="オブジェクト">
<div class="titlepage"><div><div><h2 class="title" style="clear: both">
<a name="advanced.features.objects"></a>オブジェクト</h2></div></div></div>
<p>
  Smarty は、テンプレートから PHP の
  <a class="ulink" href="http://php.net/object" target="_top">オブジェクト</a>
  へのアクセスを許可しています。オブジェクトにアクセスするには２つの方法があります。
  </p>
<div class="itemizedlist"><ul class="itemizedlist" type="disc" compact>
<li class="listitem"><p>
 １つはテンプレートに <a class="link" href="api.register.object.html" title="register_object()">オブジェクトを登録</a>
 し、<a class="link" href="language.custom.functions.html" title="Chapter 8. カスタム関数">カスタム関数</a>
 と似た構文を用いてアクセスする方法です。
 </p></li>
<li class="listitem"><p>
 もう１つの方法は <a class="link" href="api.assign.html" title="assign()"><code class="varname">assign()</code></a>
 を用いてテンプレートにオブジェクトを割り当て、
 他の割り当てられた変数のようにオブジェクトにアクセスする方法です。
 </p></li>
</ul></div>
<p>
    １つめのメソッドは素晴らしいテンプレート構文を持っています。
    それはとてもセキュアで、 登録されたオブジェクトはいくつかのメソッドやプロパティを制限する事が出来ます。
    しかし<span class="bold"><strong>繰り返しの処理やオブジェクトの配列への割り当て等の事が出来ません</strong></span>。
    あなたのニーズによって選択するメソッドは決まりますが、
    テンプレート構文を最小限守るには必ず１つめのメソッドを使用して下さい。
 </p>
<p>
  <a class="link" href="variable.security.html" title="$security"><em class="parameter"><code>$security</code></em></a>
  が有効の時、('_' から始まる) プライベートメソッドや関数にはアクセス出来ません。
  もしメソッドとプロパティで同じ名前が存在する場合、メソッドが優先されます。
  </p>
<p>
  第３パラメータにメソッドやパラメータをリストした配列を与える事でアクセスを制限できます。
  </p>
<p>
   デフォルトではテンプレートからオブジェクトに渡されたパラメータは
   <a class="link" href="language.custom.functions.html" title="Chapter 8. カスタム関数">カスタム関数</a>
   によって同じ方法で渡されます。 連想配列は第１パラメータとして渡され、
   smarty オブジェクトは第２パラメータとして渡されます。
   もし古いオブジェクトパラメータの渡し方のように各引数を一度に渡したいなら、第４パラメータに
   <code class="constant">FALSE</code> を指定します。
  </p>
<p>
   任意の第５パラメータは
   <em class="parameter"><code>format</code></em> が <code class="constant">TRUE</code> の時だけ影響し、
   ブロックとして扱われるべきオブジェクトのメソッドのリストを格納します。
   これはこれらのメソッドがテンプレート内に終了タグ
   (<code class="literal">{foobar-&gt;meth2}...{/foobar-&gt;meth2}</code>)
   を持つことを意味し、メソッドへのパラメータは
   <a class="link" href="plugins.block.functions.html" title="ブロック関数プラグイン">
   <code class="varname">block-function-plugins</code></a>
   へのパラメータと同じ構文となります。つまり、４つのパラメータ
   <em class="parameter"><code>$params</code></em>、
   <em class="parameter"><code>$content</code></em>、
   <em class="parameter"><code>&amp;$smarty</code></em> および
   <em class="parameter"><code>&amp;$repeat</code></em> を持ち、ブロック関数プラグインのように振る舞います。
  </p>
<div class="example">
<a name="id2855050"></a><p class="title"><b>Example 15.1. 登録または割り当てられたオブジェクトを使用する</b></p>
<div class="example-contents">
<pre class="programlisting">

&lt;?php
// オブジェクト

class My_Object {
  function meth1($params, &amp;$smarty_obj) {
    return 'this is my meth1';
  }
}

$myobj = new My_Object;

// オブジェクトを (参照で) 登録します
$smarty-&gt;register_object('foobar',$myobj);

// いくらかのメソッド又はプロパティを制限したい場合、それらを配列の値としてリストします
$smarty-&gt;register_object('foobar',$myobj,array('meth1','meth2','prop1'));

 // 古いオブジェクトパラメータの形式を使いたい場合、booleanのfalseを渡します。
$smarty-&gt;register_object('foobar',$myobj,null,false);

// オブジェクトを割り当てる事が可能です（できれば参照渡しで）
$smarty-&gt;assign_by_ref('myobj', $myobj);

$smarty-&gt;display('index.tpl');
?&gt;

  </pre>
<p>
   そして <code class="filename">index.tpl</code>
   でオブジェクトにアクセスするには以下のようにします。
  </p>
<pre class="programlisting">

{* 登録されたオブジェクトにアクセスします *}
{foobar-&gt;meth1 p1='foo' p2=$bar}

{* outputに割り当てる事が可能 *}
{foobar-&gt;meth1 p1='foo' p2=$bar assign='output'}
the output was {$output}

{* 割り当てたオブジェクトにアクセスします *}
{$myobj-&gt;meth1('foo',$bar)}

  </pre>
</div>
</div>
<br class="example-break"><p>
  <a class="link" href="api.register.object.html" title="register_object()"><code class="varname">register_object()</code></a>
  および
  <a class="link" href="api.assign.html" title="assign()"><code class="varname">assign()</code></a>
  も参照してください。
 </p>
</div>
</div>
<div class="navfooter">
<hr>
<table width="100%" summary="Navigation footer">
<tr>
<td width="40%" align="left">
<a accesskey="p" href="caching.cacheable.html">Prev</a> </td>
<td width="20%" align="center"><a accesskey="u" href="smarty.for.programmers.html">Up</a></td>
<td width="40%" align="right"> <a accesskey="n" href="advanced.features.prefilters.html">Next</a>
</td>
</tr>
<tr>
<td width="40%" align="left" valign="top">キャッシュ可能なプラグインの出力の制御 </td>
<td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td>
<td width="40%" align="right" valign="top"> プリフィルタ</td>
</tr>
</table>
</div>
</body>
</html>
